#-*- codeing = utf-8 -*-
#@Time : 2020/11/25 21:21
#@Author : 阳某
#@File : 21.日期和时间.py
#@Software : PyCharm

import time

before = time.time()
print('hahahahaha')
after = time.time()

print(f"调用func1，花费时间{after-before}")

# 指定格式字符串显示时间
# 以指定格式字符串显示时间，是非常常用的，比如日志里面的时间戳。
from datetime import datetime
print(datetime.now())
print(type(datetime.now()))
print(str(datetime.now()))
print(type(str(datetime.now())))

# 如果要指定输出的时间格式，可以像下面这样
print(datetime.now().strftime('%Y-%m-%d ** %H:%M:%S'))
print(type(datetime.now().strftime('%Y-%m-%d ** %H:%M:%S')))


# 当然，也可以使用time库来格式化显示字符串
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()) )
print(type(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())) )
print(time.localtime())

# 数字表示的时间转化为字符串表示
# 如果要将某个指定秒数时间（从epoch时间点开始计算），而不是当前时间，转化为字符串格式，可以这样写
print(time.strftime('%Y%m%d %H:%M:%S',time.localtime(1434502529)) )
# 字符串时间转化为整数时间
# 反过来，如果要将字符串指定的时间，转化为秒数时间，可以这样
print(int(time.mktime(time.strptime('2015-08-01 23:59:59', '%Y-%m-%d %H:%M:%S'))))
print(type(int(time.mktime(time.strptime('2015-08-01 23:59:59', '%Y-%m-%d %H:%M:%S')))))
print(time.mktime(time.strptime('2015-08-01 23:59:59', '%Y-%m-%d %H:%M:%S')))
print(type(time.mktime(time.strptime('2015-08-01 23:59:59', '%Y-%m-%d %H:%M:%S'))))

'''
ISO格式 转化为 本地时间
有的时候，我们的程序获取的时间是 ISO 8601 格式的字符串。
比如：
2008-09-03T20:56:35.450686+00:00
2008-09-03T20:56:35.450686Z
可以通过如下方法转化为 本地格式
'''
from datetime import  timezone
import dateutil.parser

dt = dateutil.parser.isoparse('2008-09-03T20:56:35.450686+00:00')
print(dt)
print(type(dt))
# 转化为本地格式 datetime
localdt = dt.replace(tzinfo=timezone.utc).astimezone(tz=None)
print(localdt)
print(type(localdt))
# 产生本地格式 字符串
print(localdt.strftime('%Y-%m-%d %H:%M:%S'))

print(datetime.now().year)
print(datetime.now().month)
print(datetime.now().day)
print(datetime.now().hour)
print(datetime.now().minute)
print(datetime.now().second)
print(datetime.now().microsecond)
# 获取星期几用 weekday方法
# 0 代表星期一，1 代表星期二 依次类推
print(datetime.now().weekday() )


'''
获得指定时间字符串对应星期几
如果要获取的是 某个指定时间，比如 “2018-6-24”，而不是当前时间，对应的星期几，怎么办？
可以使用 datetime类的 strptime方法，先产生对应的 datetime对象
'''

# 要计算出 2018年6月24日 是星期几
thatDay = "2018-6-24"
from datetime import datetime
# 先把字符串表示的日期转化为 datetime 对象
theDay = datetime.strptime(thatDay, "%Y-%m-%d")
#再获取星期几
theDay.weekday()


'''
从某个时间点往前或者后推 一段时间
如果我们想知道，2018年6月24日 往后推120天，是什么日期？星期几？
往前推120天，又是什么日期？星期几？
可以这样计算
'''


thatDay = "2018-6-24"
from datetime import datetime,timedelta
theDay = datetime.strptime(thatDay, "%Y-%m-%d")
print(theDay)
theDay = datetime.strptime(thatDay, "%Y-%m-%d").date()
print(theDay)

# 后推120天 就是 + timedelta(days=120)
target = theDay + timedelta(days=120)

print(target)
print(target.weekday())

# 前推120天 就是 - timedelta(days=120)
target = theDay - timedelta(days=120)

print(target)
print(target.weekday())


# 获得指定日期那周的周一
thatDay = "2018-6-30"
from datetime import datetime,timedelta
theDay = datetime.strptime(thatDay, "%Y-%m-%d").date()


print(theDay.weekday())#往前推5天
# 这就是 2018-6-30 那一周的周一
weekMonday = theDay - timedelta(days=theDay.weekday())
print(weekMonday.weekday())


# 获取某个月总共有多少天
# 最方便的方法是使用 calendar 模块里面的 函数

from calendar import monthrange
# monthrange返回的是元组
# 第一个元素是指定月第一天是星期几
# 第二个元素是指定月有多少天
mr = monthrange(2011, 2)

# 得到2011年2月有多少天
print(mr[1])